import os
import shutil
from random import random

from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, PatternFill
from openpyxl.utils import get_column_letter
from datetime import datetime
from openpyxl.styles import Border, Side
import pymysql
from typing import Dict, List, Optional
from spiltExcel import split_excel_inputFile



# 在create_excel_report函数前新增数据库方法
def get_stock_sectors(report_type):
    """
    获取股票行业板块信息（独立数据库方法）
    参数:
        stock_codes: 股票代码列表
    返回:
        字典{股票代码: 行业板块}
    """


    # 独立数据库配置（根据实际需要修改以下参数）
    db_config = {
        'host': '175.178.5.14',
        'port': 33066,
        'user': 'root',
        'password': '07M@Y0sqL1',
        'database': 'stock',
        'charset': 'utf8mb4',
        'connect_timeout': 10
    }

    sectors = {}
    try:
        conn = pymysql.connect(**db_config)
        with conn.cursor() as cursor:
            # 根据报告类型选择存储过程
            if report_type == 1:
                sql = "CALL Get_DWDXF_NBB"
            else:
                sql = "CALL get_BlueChipStocks"
            cursor.execute(sql)
            results = cursor.fetchall()
            #定义列名
            columns = [
                '名称', '市值(亿)', '成交额(亿)', '量比',
                '市盈率(动)', '涨跌幅(%)', '年度涨幅(%)', '行业板块'
            ]
            #根据列名获取数据
            data = []
            for row in results:
                data.append(dict(zip(columns, row)))
            return data


    except Exception as e:
        print(f"数据库查询失败: {e}")
    finally:
        if 'conn' in locals() and conn:
            conn.close()


def create_excel_report(report_type):
    wb = Workbook()
    ws = wb.active

    # 根据报告类型设置标题和文件名
    title_map = {
        1: '大消费_低位补涨_个股盘点',
        2: '白马蓝筹_低位补涨_个股盘点'
    }
    filename_map = {
        1: '低位补涨个股盘点',
        2: '白马蓝筹低位补涨个股盘点'
    }

    # 设置全局字体
    font_header = Font(name='微软雅黑', bold=True, size=26)
    font_columns = Font(name='微软雅黑', size=24)
    fill_color = PatternFill(start_color='FFD966', end_color='FFD966', fill_type='solid')
    fill_white = PatternFill(start_color='FFFFFF', end_color='FFFFFF', fill_type='solid')  # 新增白色填充

    # 第一行表头（合并A-I）
    ws.merge_cells('A1:I1')
    ws['A1'] = title_map[report_type]
    ws['A1'].font = font_header
    ws['A1'].alignment = Alignment(horizontal='center', vertical='center')
    ws['A1'].fill = fill_white  # 添加白色背景
    
    # 第二行表头
    current_date = datetime.now().strftime("%Y%m%d")
    
    # 左侧合并A-C
    ws.merge_cells('A2:C2')
    ws['A2'] = f'数据截至{current_date}'
    ws['A2'].font = font_header
    ws['A2'].alignment = Alignment(horizontal='left', vertical='center')  # 左对齐+垂直居中
    ws['A2'].fill = fill_white  # 添加白色背景
    
    # 右侧合并D-I
    ws.merge_cells('D2:I2')
    ws['D2'] = '数据仅供参考，不构成任何投资建议'
    ws['D2'].font = font_header
    ws['D2'].alignment = Alignment(horizontal='right', vertical='center')  # 右对齐+垂直居中
    ws['D2'].fill = fill_white  # 添加白色背景
    
    # 第三行列标题
    columns = [
        '序号', '名称', '市值\n(亿)', '成交额\n(亿)',
        '量比', '市盈率\n(动)', '涨跌幅\n(%)',
        '年度涨幅\n(%)', '行业板块'
    ]

    # 添加边框样式（在所有方向添加细线边框）
    thin_border = Border(left=Side(style='thin'),
                         right=Side(style='thin'),
                         top=Side(style='thin'),
                         bottom=Side(style='thin'))

    for col, title in enumerate(columns, 1):
        cell = ws.cell(row=3, column=col, value=title)
        cell.fill = fill_color
        # 第三行列标题 加粗
        cell.font = Font(name='微软雅黑', bold=True, size=24)
        # 居中对齐并启用自动换行
        cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True)  # 修改这里
        cell.border = thin_border  # 新增边框设置
        # 设置列宽自适应
        ws.column_dimensions[get_column_letter(col)].width = len(title) + 2

    # 设置自定义列宽（基于1厘米≈3.7个字符单位）
    column_widths = {
        'A': 12.88,  # 2cm
        'B': 30.65,  # 4.5cm
        'C': 25.65,  # 4.5cm
        'D': 20.47,  # 2.8cm
        'E': 15.88,  # 2.4cm
        'F': 20.47,  # 3.1cm
        'G': 18.47,  # 3.1cm
        'H': 18.47,  # 4.1cm
        'I': 30.87  # 5.1cm
    }

    for col, width in column_widths.items():
        ws.column_dimensions[col].width = width

    data = get_stock_sectors(report_type)

    # 修改数据写入逻辑（从第4行开始）
    for row_idx, item in enumerate(data, start=4):
        # 序号列（A列）也填充边框
        ws.cell(row=row_idx, column=1, value=row_idx - 3).alignment = Alignment(horizontal='center', vertical='center')
        ws.cell(row=row_idx, column=1).border = thin_border  # 新增边框设置]
        # 字体设为微软雅黑
        # 字体大小为18
        ws.cell(row=row_idx, column=1).font = font_columns
        # 数据列（B-I列）
        columns_mapping = [
            ('名称', 2),  # B列
            ('市值(亿)', 3),  # C列
            ('成交额(亿)', 4),  # D列
            ('量比', 5),  # E列
            ('市盈率(动)', 6),  # F列
            ('涨跌幅(%)', 7),  # G列
            ('年度涨幅(%)', 8),  # H列
            ('行业板块', 9)  # I列
        ]

        # 应用样式并写入数据
        for field, col in columns_mapping:
            cell = ws.cell(row=row_idx, column=col, value=item.get(field, ''))
            #B列加粗
            cell.font = font_columns

            if field == '名称':
                cell.font = Font(name='微软雅黑', bold=True, size=24)
            cell.alignment = Alignment(horizontal='center', vertical='center')
            cell.border = thin_border  # 添加边框

    # 保存文件 添加时间戳
    #年月日时间戳
    dayMonthYear = datetime.now().strftime("%Y%m%d")
    # 确保目录存在
    inputFileUrl=f'../spiltExcel/input/excel/{dayMonthYear}/{filename_map[report_type]}_{dayMonthYear}.xlsx'
    os.makedirs(os.path.dirname(inputFileUrl), exist_ok=True)
    wb.save(inputFileUrl)
    print(f'{filename_map[report_type]}_{dayMonthYear}.xlsx文件已生成')
    print("开始生成截图")
    # 截图
    outputFileUrl=f'../spiltExcel/output/{dayMonthYear}/{filename_map[report_type]}/'
    split_excel_inputFile(inputFileUrl,outputFileUrl,'1')
    #随机选择模板中的封面 D:\code\pythonCode\pythonProject\模板\images
    # 将封面复制到输出目录的images文件夹
    os.makedirs(os.path.join(outputFileUrl, 'images'), exist_ok=True)

    # 确保输出目录存在
    cover_dir = '../模板/images'
    cover_files = os.listdir(cover_dir)
    if cover_files:
        #当前月的天数%4+1 取得后缀
        day = datetime.now().day
        suffix = str(day % 4 + 1)
        if report_type == 1:
            cover_file = f'大消费低位补涨_{suffix}.jpg'
        else:
            cover_file = f'白马蓝筹_{suffix}.jpg'
        print(f"封面为{cover_file}")
        cover_path = os.path.join(cover_dir, cover_file)
        shutil.copy(cover_path, os.path.join(outputFileUrl, 'images', f'0_cover_{suffix}.jpg'))
    print("封面复制完成")
    print("=====输出文本内容=====")
    if report_type == 1:
        dayMonth = datetime.now().strftime("%m.%d")
        # dayMonth去掉前缀的0
        dayMonth = dayMonth.lstrip('0')
        print(f"大消费_低位补涨个股盘点_{dayMonth}")
        print(f"本笔记通过多个核心指标筛选来自大消费的低位补涨个股")
        print("①4.8至今涨幅低于15%")
        print("②年涨幅低于10%")
        print("③剔除st股")
        print(f"本次共统计{len(data)}个来自大消费的成分股，消费要出台很多利好，低位大消费补涨真的得重视")
        print("ps：数据仅供参考，不构成投资建议")
    else:
        dayMonth = datetime.now().strftime("%m.%d")
        # dayMonth去掉前缀的0
        dayMonth = dayMonth.lstrip('0')
        print(f"白马蓝筹_低位补涨个股盘点_{dayMonth}")
        print(f"本笔记通过多个核心指标筛选出存在低位补涨机会的白马蓝筹成分股，信息来自沪深300以及中证500")
        print("①三季度盈利")
        print("②年涨幅低于15%")
        print("③动态市盈率0-60")
        print(f"本次共统计{len(data)}个来自白马蓝筹的成分股，白马蓝筹是A股真正的核心，是值得深度挖掘的⛏️")
        print("ps：数据仅供参考，不构成投资建议")


def process():
    main()

def main():
    print("1: 获取大消费低位补涨")
    create_excel_report(1)
    print("2: 获取白马蓝筹低位补涨")
    create_excel_report(2)

if __name__ == '__main__':
    main()
